package com.net.io.netty.decode.http;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpContentCompressor;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpRequestDecoder;
import io.netty.handler.codec.http.HttpResponseEncoder;
import io.netty.handler.ssl.SslContext;

/**
 * @author zhangtengfei
 * @date 2022/2/16 14:23
 */
public class ServerHandlerInit extends ChannelInitializer<SocketChannel> {

    private final SslContext sslCtx;

    public ServerHandlerInit(SslContext sslCtx) {
        this.sslCtx = sslCtx;
    }

    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline ph = ch.pipeline();
        if (sslCtx != null) {
            // 使用 HTTPS：启用 HTTPS 只需要将 SslHandler 添加到 ChannelPipeline 的 ChannelHandler 组合中。
            ph.addLast(sslCtx.newHandler(ch.alloc()));
        }
        // 把应答报文 编码
        ph.addLast("encoder", new HttpResponseEncoder());
        // 把请求报文 解码
        ph.addLast("decoder", new HttpRequestDecoder());

        // 聚合http为一个完整的报文
        ph.addLast("aggregator", new HttpObjectAggregator(10 * 1024 * 1024));
        // 把应答报文 压缩,非必要
        ph.addLast("compressor", new HttpContentCompressor());

        ph.addLast(new BusiHandler());
    }
}
